TerraformでState Lockエラーが発生したら
Terraformでエラーが発生した
terraform apply
,terraform state list
などのコマンドを実行した際にエラーが出るようになってしまいました。
╷ │ Error: Error acquiring the state lock │ │ Error message: resource temporarily unavailable │ Lock Info: │ ID: 89e54252-fef0-2a68-17bf-e0bb411ff1e3 │ Path: terraform.tfstate │ Operation: OperationTypeInvalid │ Who: myname@foo.local │ Version: 1.1.5 │ Created: 2022-02-21 06:26:07.435925 +0000 UTC │ Info: │ │ │ Terraform acquires a state lock to protect the state from being written │ by multiple users at the same time. Please resolve the issue above and try │ again. For most commands, you can disable locking with the "-lock=false" │ flag, but this is not recommended. ╵
どうやらStateファイルにアクセスするコマンドで軒並みこのエラーが出るようになったようです。
原因は、エラーが発生する直前にterraform apply
を実行して途中で中断してしまったからだと考えられます。(AWSの一時クレデンシャルの期限切れが起こっていて処理が全然進まなかったので途中中断しました)
apply中は(設定していれば)stateがロックされ、他のユーザーが重複して処理を行なうことを防いでくれます。applyが終わればロック解除されるのですが今回は途中中断してしまったのでstateファイルがロックされたままになっていたようです。
このままだと何もプロビジョニングできないので修正する必要があります。
解決方法
terraform force-unlock
コマンドを使いましょう。ロックを手動解除できます。(もちろん本当に他に処理実行中の人やパイプラインがいないかの確認を忘れずに!)
% terraform force-unlock --help Usage: terraform [global options] force-unlock LOCK_ID Manually unlock the state for the defined configuration. This will not modify your infrastructure. This command removes the lock on the state for the current workspace. The behavior of this lock is dependent on the backend being used. Local state files cannot be unlocked by another process. Options: -force Don't ask for input for unlock confirmation.
LOCK_ID
に入れるのはエラーメッセージに出てきたID値です。
もしくは-lock=false
オプションをつけて各コマンドを実行する方法でもロックを外せます。
local stateの場合は
ただしこれらの方法はlocal stateを使っていた場合はエラー解消できません。
% terraform force-unlock 89e54252-fef0-2a68-17bf-e0bb411ff1e3 Local state cannot be unlocked by another process
この場合はローカルのTerraformのプロセスをkillすればエラー解消できます。